package com.yswy.backstage.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yswy.backstage.dto.filter.SysConfigPageFilter;
import com.yswy.backstage.dto.req.SysConfigOptionReqVO;
import com.yswy.backstage.dto.res.SysConfigPageResVO;
import com.yswy.backstage.service.ISysConfigService;
import com.yswy.common.convert.Convert;
import com.yswy.common.utils.StringUtils;
import com.yswy.common.utils.redis.RedisCache;
import com.yswy.common.utils.redis.RedisConstants;


import com.yswy.common.utils.redis.RedisUtil;
import com.yswy.domain.entity.SysConfig;
import com.yswy.domain.mapper.SysConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import static com.yswy.backstage.utils.CrudUtils.createOrUpdate;
import static com.yswy.backstage.utils.CrudUtils.page;


/**
 * @author 19401
 * @date 2022/6/14 10:37
 **/
@Slf4j
@Service
public class ISysConfigServiceImpl implements ISysConfigService {
    @Autowired
    private SysConfigMapper sysConfigMapper;
    @Autowired
    private RedisUtil redisUtil;

    @Override
    public Page<SysConfigPageResVO> sysConfigPage(SysConfigPageFilter filter, Long optionId) {
        return page(sysConfigMapper, filter, s -> {
            s.and(StringUtils.isNotEmpty(filter.getKeyWord()), a -> {
                a.like(SysConfig::getConfigName, filter.getKeyWord())
                .or(r -> r.like(SysConfig::getConfigKey, filter.getKeyWord()))
                .or(r -> r.like(SysConfig::getConfigValue, filter.getKeyWord()));
            }).orderByDesc(SysConfig::getId);
        }, r -> {
        }, m -> {
            SysConfigPageResVO bo = BeanUtil.copyProperties(m, SysConfigPageResVO.class);
            return bo;
        });
    }

    @Override
    public void sysConfigCreate(SysConfigOptionReqVO req, Long optionId) {
        sysConfigUpdate(req, optionId);
    }

    @Override
    public void sysConfigUpdate(SysConfigOptionReqVO req, Long optionId) {
        SysConfig bo = BeanUtil.copyProperties(req, SysConfig.class);
        Long id = bo.getId();
        createOrUpdate(sysConfigMapper, id, bo, s -> s.eq(SysConfig::getConfigName, req.getConfigName())
                .notIn(null != id, SysConfig::getId, id));
        // 更新Redis
        redis(bo.getConfigKey(), bo.getConfigValue());
    }

    private void redis(String configKey, Object v) {
        redisUtil.setObject(String.format("%s%s", RedisConstants.SYS_CONFIG_KEY, configKey), v);
    }

    @Override
    public void sysConfigDelete(Long id, Long optionId) {

    }


    /**
     * 根据键名查询参数配置信息
     *
     * @param configKey 参数key
     * @return 参数键值
     */
    @Override
    public String selectConfigByKey(String configKey)
    {
        String configValue = Convert.toStr(redisUtil.get
                (getCacheKey(configKey)));
        if (com.yswy.common.utils.StringUtils.isNotEmpty(configValue))
        {
            return configValue;
        }
        SysConfig retConfig = sysConfigMapper.selectOne(new LambdaQueryWrapper<SysConfig>()
                .eq(SysConfig::getConfigKey , configKey));
        if (com.yswy.common.utils.StringUtils.isNotNull(retConfig))
        {
            redisUtil.setObject(getCacheKey(configKey), retConfig.getConfigValue());
            return retConfig.getConfigValue();
        }
        return com.yswy.common.utils.StringUtils.EMPTY;
    }

    /**
     * 设置cache key
     *
     * @param configKey 参数键
     * @return 缓存键key
     */
    private String getCacheKey(String configKey)
    {
        return RedisConstants.SYS_CONFIG_KEY + configKey;
    }





}
